์๋ฐ์คํฌ๋ฆฝํธ์์์ ๋์์ฑ B-ํธ๋ฆฌ ๊ตฌํ๊ณผ ์ด์ ์ ํ์ํ๊ณ , ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋์์ฑ B-ํธ๋ฆฌ: ์ค๋ ๋ ์์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ํ ์ฌ์ธต ๋ถ์
ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์์ญ, ํนํ Node.js๋ Deno์ ๊ฐ์ ์๋ฒ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ๋ถ์๊ณผ ํจ๊ป, ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ์ ํ์์ฑ์ด ๋งค์ฐ ์ค์ํด์ก์ต๋๋ค. ๋์์ฑ ์์ ์ ๋ค๋ฃฐ ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋์์ ๋ณด์ฅํ๋ ๊ฒ์ ์๋นํ ๊ณผ์ ์ ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ๋์์ฑ B-ํธ๋ฆฌ(Concurrent B-Tree)๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํ๋ ๋์์ฑ B-ํธ๋ฆฌ์ ๋ํด ํฌ๊ด์ ์ผ๋ก ํ์ํ๋ฉฐ, ๊ทธ ๊ตฌ์กฐ, ์ด์ , ๊ตฌํ ์ ๊ณ ๋ ค์ฌํญ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
B-ํธ๋ฆฌ ์ดํดํ๊ธฐ
๋์์ฑ์ ๋ณต์กํ ์ธ๊ณ๋ก ๋ฐ์ด๋ค๊ธฐ ์ ์, B-ํธ๋ฆฌ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉฐ ํํํ ๊ธฐ์ด๋ฅผ ๋ค์ ธ๋ด ์๋ค. B-ํธ๋ฆฌ๋ ๋์คํฌ I/O ์์ ์ ์ต์ ํํ๋๋ก ์ค๊ณ๋ ์๊ฐ ๊ท ํ ํธ๋ฆฌ ์๋ฃ ๊ตฌ์กฐ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ ๋ฐ ํ์ผ ์์คํ ์ ํนํ ์ ํฉํฉ๋๋ค. ์ด์ง ํ์ ํธ๋ฆฌ์ ๋ฌ๋ฆฌ, B-ํธ๋ฆฌ๋ ์ฌ๋ฌ ์์์ ๊ฐ์ง ์ ์์ด ํธ๋ฆฌ์ ๋์ด๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ํน์ ํค๋ฅผ ์ฐพ๋ ๋ฐ ํ์ํ ๋์คํฌ ์ ๊ทผ ํ์๋ฅผ ์ต์ํํฉ๋๋ค. ์ผ๋ฐ์ ์ธ B-ํธ๋ฆฌ์์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค:
- ๊ฐ ๋ ธ๋๋ ํค ์งํฉ๊ณผ ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ํฌํจํฉ๋๋ค.
- ๋ชจ๋ ๋ฆฌํ ๋ ธ๋๋ ๋์ผํ ๋ ๋ฒจ์ ์์ด ๊ท ํ ์กํ ์ ๊ทผ ์๊ฐ์ ๋ณด์ฅํฉ๋๋ค.
- ๊ฐ ๋ ธ๋(๋ฃจํธ ์ ์ธ)๋ t-1๊ฐ์์ 2t-1๊ฐ ์ฌ์ด์ ํค๋ฅผ ํฌํจํ๋ฉฐ, ์ฌ๊ธฐ์ t๋ B-ํธ๋ฆฌ์ ์ต์ ์ฐจ์์ ๋๋ค.
- ๋ฃจํธ ๋ ธ๋๋ 1๊ฐ์์ 2t-1๊ฐ ์ฌ์ด์ ํค๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
- ๋ ธ๋ ๋ด์ ํค๋ ์ ๋ ฌ๋ ์์๋ก ์ ์ฅ๋ฉ๋๋ค.
B-ํธ๋ฆฌ์ ๊ท ํ ์กํ ํน์ฑ์ ๊ฒ์, ์ฝ์ , ์ญ์ ์์ ์ ๋ํด ๋ก๊ทธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ณด์ฅํ๋ฏ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์ ํ์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ์ด์ปค๋จธ์ค ํ๋ซํผ์ ์ฌ๊ณ ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ด ์๋ค. B-ํธ๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ณ ๊ฐ ์๋ฐฑ๋ง ๊ฐ์ ์์ดํ ์ผ๋ก ๋์ด๋๋๋ผ๋ ์ ํ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค.
๋์์ฑ์ ํ์์ฑ
๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์์ B-ํธ๋ฆฌ ์์ ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ง์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๋ ์น ์๋ฒ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์์์ํค์ง ์์ผ๋ฉด์ ๋์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๊ฒฌ๋ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์๋๋ฆฌ์ค์์ ์ ์ ํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ ์์ด ํ์ค B-ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฝ์ ์กฐ๊ฑด(race condition) ๋ฐ ๋ฐ์ดํฐ ์์์ ์ด๋ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๊ฐ์ ์ด๋ฒคํธ์ ํฐ์ผ์ ์๋งคํ๋ ค๋ ์จ๋ผ์ธ ํฐ์ผํ ์์คํ ์ ์๊ฐํด ๋ด ์๋ค. ๋์์ฑ ์ ์ด๊ฐ ์๋ค๋ฉด ํฐ์ผ์ด ์ด๊ณผ ํ๋งค๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ ์ฌ์ ์ธ ์ฌ์ ์ ์์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋์์ฑ ์ ์ด๋ ์ฌ๋ฌ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ํธ๋ฆฌ์ ๋ ธ๋์ ๋ํ ๋์ ์ ๊ทผ์ ์ฒ๋ฆฌํ๊ณ , ๋ฐ์ดํฐ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๋ฉฐ, ์ ๋ฐ์ ์ธ ์์คํ ์ฑ๋ฅ์ ์ ์งํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
๋์์ฑ ์ ์ด ๊ธฐ๋ฒ
B-ํธ๋ฆฌ์์ ๋์์ฑ ์ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋ฝ(Locking)
๋ฝ์ ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ์ ํํ๋ ๊ธฐ๋ณธ์ ์ธ ๋์์ฑ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๋๋ค. B-ํธ๋ฆฌ์ ๋งฅ๋ฝ์์ ๋ฝ์ ์ ์ฒด ํธ๋ฆฌ(์กฐ๋ ๋จ์ ๋ฝ)๋ ๊ฐ๋ณ ๋ ธ๋(์ธ๋ถํ๋ ๋จ์ ๋ฝ)์ ๊ฐ์ ๋ค์ํ ์์ค์์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ์ค๋ ๋๊ฐ ๋ ธ๋๋ฅผ ์์ ํด์ผ ํ ๋, ํด๋น ๋ ธ๋์ ๋ฝ์ ํ๋ํ์ฌ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์กฐ๋ ๋จ์ ๋ฝ (Coarse-Grained Locking)
์กฐ๋ ๋จ์ ๋ฝ์ ์ ์ฒด B-ํธ๋ฆฌ์ ๋ํด ๋จ์ผ ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ตฌํ์ ๊ฐ๋จํ์ง๋ง, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ํธ๋ฆฌ์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๋์์ฑ์ ํฌ๊ฒ ์ ํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์ํผ๋ง์ผ์ ๊ณ์ฐ๋๊ฐ ํ๋๋ง ์ด๋ ค ์๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค. ๊ฐ๋จํ์ง๋ง ๊ธด ์ค๊ณผ ์ง์ฐ์ ์ ๋ฐํฉ๋๋ค.
์ธ๋ถํ๋ ๋จ์ ๋ฝ (Fine-Grained Locking)
๋ฐ๋ฉด์ ์ธ๋ถํ๋ ๋จ์ ๋ฝ์ B-ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋์ ๋ํด ๋ณ๋์ ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ํธ๋ฆฌ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋์์ ์ ๊ทผํ ์ ์์ด ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ถํ๋ ๋จ์ ๋ฝ์ ๋ฝ์ ๊ด๋ฆฌํ๊ณ ๊ต์ฐฉ ์ํ(deadlock)๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ์ผ๊ธฐํฉ๋๋ค. ๋ํ ์ํผ๋ง์ผ์ ๊ฐ ๊ตฌ์ญ๋ง๋ค ์์ฒด ๊ณ์ฐ๋๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ด๋ ํจ์ฌ ๋น ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง ๋ ๋ง์ ๊ด๋ฆฌ์ ์กฐ์จ์ด ํ์ํฉ๋๋ค.
2. ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ (Read-Write Locks)
์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ(๊ณต์ -๋ฐฐํ ๋ฝ์ด๋ผ๊ณ ๋ ํจ)์ ์ฝ๊ธฐ ์์ ๊ณผ ์ฐ๊ธฐ ์์ ์ ๊ตฌ๋ถํฉ๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋ ธ๋์ ๋ํ ์ฝ๊ธฐ ๋ฝ์ ํ๋ํ ์ ์์ง๋ง, ์ฐ๊ธฐ ๋ฝ์ ์ค์ง ํ๋์ ์ค๋ ๋๋ง ํ๋ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฝ๊ธฐ ์์ ์ด ํธ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์์ ํ์ง ์๋๋ค๋ ์ฌ์ค์ ํ์ฉํ์ฌ, ์ฝ๊ธฐ ์์ ์ด ์ฐ๊ธฐ ์์ ๋ณด๋ค ๋น๋ฒํ ๋ ๋ ๋์ ๋์์ฑ์ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ ์นดํ๋ก๊ทธ ์์คํ ์์ ์ฝ๊ธฐ(์ ํ ์ ๋ณด ํ์)๋ ์ฐ๊ธฐ(์ ํ ์ ๋ณด ์ ๋ฐ์ดํธ)๋ณด๋ค ํจ์ฌ ๋น๋ฒํฉ๋๋ค. ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ์ ์ฌ์ฉํ๋ฉด ์๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์นดํ๋ก๊ทธ๋ฅผ ํ์ํ ์ ์์ผ๋ฉด์๋, ์ ํ ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ ๋ฐฐํ์ ์ธ ์ ๊ทผ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
3. ๋๊ด์ ๋ฝ (Optimistic Locking)
๋๊ด์ ๋ฝ์ ์ถฉ๋์ด ๋๋ฌผ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ ธ๋์ ์ ๊ทผํ๊ธฐ ์ ์ ๋ฝ์ ํ๋ํ๋ ๋์ , ๊ฐ ์ค๋ ๋๋ ๋ ธ๋๋ฅผ ์ฝ๊ณ ์์ ์ ์์ ์ ์ํํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๊ธฐ ์ ์, ์ค๋ ๋๋ ๊ทธ๋์ ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ๋ ธ๋๊ฐ ์์ ๋์๋์ง ํ์ธํฉ๋๋ค. ์ด ํ์ธ์ ๋ ธ๋์ ๊ด๋ จ๋ ๋ฒ์ ๋ฒํธ๋ ํ์์คํฌํ๋ฅผ ๋น๊ตํ์ฌ ์ํํ ์ ์์ต๋๋ค. ์ถฉ๋์ด ๊ฐ์ง๋๋ฉด ์ค๋ ๋๋ ์์ ์ ์ฌ์๋ํฉ๋๋ค. ๋๊ด์ ๋ฝ์ ์ฝ๊ธฐ ์์ ์ด ์ฐ๊ธฐ ์์ ์ ํจ์ฌ ๋ฅ๊ฐํ๊ณ ์ถฉ๋์ด ๋๋ฌธ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค. ํ์ ๋ฌธ์ ํธ์ง ์์คํ ์์ ๋๊ด์ ๋ฝ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋ฌธ์๋ฅผ ํธ์งํ ์ ์๊ฒ ํฉ๋๋ค. ๋ง์ฝ ๋ ์ฌ์ฉ์๊ฐ ์ฐ์ฐํ ๊ฐ์ ๋ถ๋ถ์ ๋์์ ํธ์งํ๊ฒ ๋๋ฉด, ์์คํ ์ ๊ทธ์ค ํ ๋ช ์๊ฒ ์ถฉ๋์ ์๋์ผ๋ก ํด๊ฒฐํ๋๋ก ์์ฒญํ ์ ์์ต๋๋ค.
4. ๋ฝ ํ๋ฆฌ ๊ธฐ๋ฒ (Lock-Free Techniques)
๋ฝ ํ๋ฆฌ ๊ธฐ๋ฒ, ์๋ฅผ ๋ค์ด ๋น๊ต-๊ตํ(CAS) ์ฐ์ฐ ๊ฐ์ ๊ฒ๋ค์ ๋ฝ ์ฌ์ฉ์ ์์ ํ ํผํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ๊ธฐ๋ณธ ํ๋์จ์ด์์ ์ ๊ณตํ๋ ์์์ ์ฐ์ฐ์ ์์กดํ์ฌ ์์ ์ด ์ค๋ ๋ ์์ ๋ฐฉ์์ผ๋ก ์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ฝ ํ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ง๋ง, ์ ํํ๊ฒ ๊ตฌํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ธฐ๋ก ์ ๋ช ๋์ต๋๋ค. ์ด๋ค ๋๊ตฌ๋ก๋ ๊ณ ์ ํ์ง ์๊ณ , ๋ฉ์ถ์ง๋ ์์ผ๋ฉด์ ์ค์ง ์ ๋ฐํ๊ณ ์๋ฒฝํ๊ฒ ์๊ฐ์ด ๋ง๋ ์์ง์๋ง์ผ๋ก ๋ณต์กํ ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ค๋ ค๊ณ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ด๊ฒ์ด ๋ฐ๋ก ๋ฝ ํ๋ฆฌ ๊ธฐ๋ฒ์ ์๊ตฌ๋๋ ์ ๋ฐ๋์ ์กฐ์จ ์์ค์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ B-ํธ๋ฆฌ ๊ตฌํํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ B-ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋์์ฑ ์ ์ด ๋ฉ์ปค๋์ฆ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ํน์ ํน์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์ด๋ฏ๋ก, ์ง์ ํ ๋ณ๋ ฌ์ฑ์ ์ง์ ์ ์ผ๋ก ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์์ ๊ณผ ์น ์์ปค(Web Worker)์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
1. ๋น๋๊ธฐ ์์
๋น๋๊ธฐ ์์ ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ฉ์ถ์ง ์๊ณ ๋ ผ๋ธ๋กํน I/O ๋ฐ ๊ธฐํ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค. Promise์ async/await๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ ๊ต์ฐจ ์คํํ์ฌ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. ์ด๋ I/O ์ค์ฌ ์์ ์ด ํํ Node.js ํ๊ฒฝ์์ ํนํ ์ ์ฉํฉ๋๋ค. ์น ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ B-ํธ๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ด๋ฌํ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํจ์ผ๋ก์จ, ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์์ฒญ์ ๊ณ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
2. ์น ์์ปค (Web Workers)
์น ์์ปค๋ ๋ณ๋์ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํ ๋ณ๋ ฌ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์น ์์ปค๋ DOM์ ์ง์ ์ ๊ทผํ ์๋ ์์ง๋ง, ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ฑ B-ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ค๋ฉด B-ํธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ์ฌ ๋ฉ์ธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๊ฐ์ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ๊ณ B-ํธ๋ฆฌ์ ์ธ๋ฑ์ฑํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ธ๋ฑ์ฑ ์์ ์ ์น ์์ปค์ ์คํ๋ก๋ํจ์ผ๋ก์จ ๋ฉ์ธ ์ค๋ ๋๋ ๋ฐ์์ฑ์ ์ ์งํ์ฌ ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
3. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ ๊ตฌํํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก, Promise์ ํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๊ธฐ ์์ฒญ๊ณผ ์ฐ๊ธฐ ์์ฒญ์ ๋ํ ๋ณ๋์ ํ๋ฅผ ์ ์งํ๊ณ , ํ ๋ฒ์ ํ๋์ ์ฐ๊ธฐ ์์ฒญ ๋๋ ์ฌ๋ฌ ๊ฐ์ ์ฝ๊ธฐ ์์ฒญ๋ง ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋ค์์ ๋จ์ํ๋ ์์์ ๋๋ค:
class ReadWriteLock {
constructor() {
this.readers = [];
this.writer = null;
this.queue = [];
}
async readLock() {
return new Promise((resolve) => {
this.queue.push({
type: 'read',
resolve,
});
this.processQueue();
});
}
async writeLock() {
return new Promise((resolve) => {
this.queue.push({
type: 'write',
resolve,
});
this.processQueue();
});
}
unlock() {
if (this.writer) {
this.writer = null;
} else {
this.readers.shift();
}
this.processQueue();
}
async processQueue() {
if (this.writer || this.readers.length > 0) {
return; // Already locked
}
if (this.queue.length > 0) {
const next = this.queue.shift();
if (next.type === 'read') {
this.readers.push(next);
next.resolve();
this.processQueue(); // Allow multiple readers
} else if (next.type === 'write') {
this.writer = next;
next.resolve();
}
}
}
}
์ด ๊ธฐ๋ณธ ๊ตฌํ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ํ๋ก๋์ ์์ค์ ๊ตฌํ์๋ ๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ธฐ์ ์ํ(starvation)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ณต์ ์ฑ ์ ์ฑ ์ด ํ์ํ ๊ฒ์ ๋๋ค.
์์ : ๋จ์ํ๋ ๋์์ฑ B-ํธ๋ฆฌ ๊ตฌํ
์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํ๋ ๋์์ฑ B-ํธ๋ฆฌ์ ๋จ์ํ๋ ์์ ์ ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ธ ์์์ด๋ฉฐ ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ถ๊ฐ์ ์ธ ๊ฐ์ ์ด ํ์ํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
class BTreeNode {
constructor(leaf = false) {
this.keys = [];
this.children = [];
this.leaf = leaf;
}
}
class ConcurrentBTree {
constructor(t) {
this.root = new BTreeNode(true);
this.t = t; // Minimum degree
this.lock = new ReadWriteLock();
}
async insert(key) {
await this.lock.writeLock();
try {
let r = this.root;
if (r.keys.length === 2 * this.t - 1) {
let s = new BTreeNode();
this.root = s;
s.children[0] = r;
this.splitChild(s, 0, r);
this.insertNonFull(s, key);
} else {
this.insertNonFull(r, key);
}
} finally {
this.lock.unlock();
}
}
async insertNonFull(x, key) {
let i = x.keys.length - 1;
if (x.leaf) {
while (i >= 0 && key < x.keys[i]) {
x.keys[i + 1] = x.keys[i];
i--;
}
x.keys[i + 1] = key;
} else {
while (i >= 0 && key < x.keys[i]) {
i--;
}
i++;
await this.lock.readLock(); // Read lock for child
try {
if (x.children[i].keys.length === 2 * this.t - 1) {
this.splitChild(x, i, x.children[i]);
if (key > x.keys[i]) {
i++;
}
}
await this.insertNonFull(x.children[i], key);
} finally {
this.lock.unlock(); // Unlock after accessing child
}
}
}
async splitChild(x, i, y) {
let z = new BTreeNode(y.leaf);
for (let j = 0; j < this.t - 1; j++) {
z.keys[j] = y.keys[j + this.t];
}
if (!y.leaf) {
for (let j = 0; j < this.t; j++) {
z.children[j] = y.children[j + this.t];
}
}
y.keys.length = this.t - 1;
y.children.length = this.t;
for (let j = x.keys.length; j >= i + 1; j--) {
x.keys[j + 1] = x.keys[j];
}
x.keys[i] = y.keys[this.t - 1];
for (let j = x.children.length; j >= i + 2; j--) {
x.children[j + 1] = x.children[j];
}
x.children[i + 1] = z;
x.keys.length++;
}
async search(key) {
await this.lock.readLock();
try {
return this.searchKey(this.root, key);
} finally {
this.lock.unlock();
}
}
async searchKey(x, key) {
let i = 0;
while (i < x.keys.length && key > x.keys[i]) {
i++;
}
if (i < x.keys.length && key === x.keys[i]) {
return true;
}
if (x.leaf) {
return false;
}
await this.lock.readLock(); // Read lock for child
try {
return this.searchKey(x.children[i], key);
} finally {
this.lock.unlock(); // Unlock after accessing child
}
}
}
์ด ์์ ๋ ์๋ฎฌ๋ ์ด์
๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋์ ์์
์ค์ B-ํธ๋ฆฌ๋ฅผ ๋ณดํธํฉ๋๋ค. insert ๋ฐ search ๋ฉ์๋๋ ํธ๋ฆฌ์ ๋
ธ๋์ ์ ๊ทผํ๊ธฐ ์ ์ ์ ์ ํ ๋ฝ์ ํ๋ํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
๋์์ฑ ์ ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ํ์์ ์ด์ง๋ง, ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์๋ ์์ต๋๋ค. ํนํ ๋ฝ ๋ฉ์ปค๋์ฆ์ ์ ์คํ๊ฒ ๊ตฌํํ์ง ์์ผ๋ฉด ๊ฒฝํฉ์ ์ ๋ฐํ๊ณ ์ฒ๋ฆฌ๋์ ๊ฐ์์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋์์ฑ B-ํธ๋ฆฌ๋ฅผ ์ค๊ณํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ฝ์ ์ธ๋ถ์ฑ(Granularity): ์ธ๋ถํ๋ ๋จ์ ๋ฝ์ ์ผ๋ฐ์ ์ผ๋ก ์กฐ๋ ๋จ์ ๋ฝ๋ณด๋ค ๋ ๋์ ๋์์ฑ์ ์ ๊ณตํ์ง๋ง, ๋ฝ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํต๋๋ค.
- ๋ฝ ์ ๋ต: ์ฝ๊ธฐ ์์ ์ด ์ฐ๊ธฐ ์์ ๋ณด๋ค ๋น๋ฒํ ๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ์์ : ๋น๋๊ธฐ ์์ ์ ์ฌ์ฉํ๋ฉด ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ์ ํผํ๊ณ ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์น ์์ปค: ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์น ์์ปค์ ์คํ๋ก๋ํ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํ ๋ณ๋ ฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์บ์ ์ต์ ํ: ์์ฃผ ์ ๊ทผํ๋ ๋ ธ๋๋ฅผ ์บ์ํ์ฌ ๋ฝ ํ๋ ํ์์ฑ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๋ฒค์น๋งํน์ ๋ค์ํ ๋์์ฑ ์ ์ด ๊ธฐ๋ฒ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ณ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐ ํ์์ ์
๋๋ค. Node.js์ ๋ด์ฅ๋ perf_hooks ๋ชจ๋๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์
์ ์คํ ์๊ฐ์ ์ธก์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๋์์ฑ B-ํธ๋ฆฌ๋ ๋ค์์ ํฌํจํ ๋ค์ํ ์์ญ์์ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉ๋ฉ๋๋ค:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: B-ํธ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ฒ์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ ๋ค์ค ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค. ์ฌ๋ฌ ์๋ฒ๊ฐ ๋์ผํ ์ธ๋ฑ์ค์ ์ ๊ทผํ๊ณ ์์ ํด์ผ ํ๋ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์๊ฐํด ๋ด ์๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ ๋ชจ๋ ์๋ฒ์์ ์ธ๋ฑ์ค๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ํ์ผ ์์คํ : B-ํธ๋ฆฌ๋ ํ์ผ ์ด๋ฆ, ํฌ๊ธฐ, ์์น์ ๊ฐ์ ํ์ผ ์์คํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ ์์ ์์ด ๋์์ ํ์ผ ์์คํ ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๊ฒ ํฉ๋๋ค.
- ๊ฒ์ ์์ง: B-ํธ๋ฆฌ๋ ๋น ๋ฅธ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ์น ํ์ด์ง๋ฅผ ์ธ๋ฑ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๋์์ ๊ฒ์์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋น ์๋ฐฑ๋ง ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋๊ท๋ชจ ๊ฒ์ ์์ง์ ์์ํด ๋ณด์ธ์. ๋์์ฑ B-ํธ๋ฆฌ ์ธ๋ฑ์ค๋ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ๋ฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ค์๊ฐ ์์คํ : ์ค์๊ฐ ์์คํ ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ ๊ทผํ๊ณ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ๋์์ฑ B-ํธ๋ฆฌ๋ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ์ ๊ฑฐ๋ ์์คํ ์์ ๋์์ฑ B-ํธ๋ฆฌ๋ ์ค์๊ฐ์ผ๋ก ์ฃผ๊ฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ B-ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋์ ๊ณผ ๊ธฐํ๋ฅผ ๋์์ ์ ์ํฉ๋๋ค. ๋์์ฑ ์ ์ด ๋ฉ์ปค๋์ฆ, ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ, ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ํน์ ํน์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ, ํ๋ ๋ค์ค ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ ๋๋ฌธ์ ๋์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด ๋น๋๊ธฐ ์์ ์ด๋ ์น ์์ปค์ ๊ฐ์ ์ฐฝ์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํ์ง๋ง, ์ ๊ตฌํ๋ ๋์์ฑ B-ํธ๋ฆฌ๊ฐ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฑ๋ฅ ์ธก๋ฉด์์ ์ ๊ณตํ๋ ์ด์ ์ ๋ถ์ธํ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ์๋ฒ์ฌ์ด๋ ๋ฐ ๊ธฐํ ์ฑ๋ฅ์ด ์ค์ํ ์์ญ์ผ๋ก ๊ทธ ๋ฒ์๋ฅผ ํ์ฅํจ์ ๋ฐ๋ผ, B-ํธ๋ฆฌ์ ๊ฐ์ ๋์์ฑ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๊ตฌํํ๋ ๊ฒ์ ์ค์์ฑ์ ๊ณ์ํด์ ์ปค์ง ๊ฒ์ ๋๋ค.
์ด ๊ธ์์ ๋ ผ์๋ ๊ฐ๋ ๋ค์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์คํ ์ ๊ฑธ์ณ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ , ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ , ๋๋ ๋ถ์ฐ ๊ฒ์ ์์ง์ ๊ตฌ์ถํ๋ , ๋์์ฑ B-ํธ๋ฆฌ์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ๊ท์คํ ์์ฐ์ด ๋ ๊ฒ์ ๋๋ค.